package com.rengwuxian.coursecoroutines._4_flow

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlin.coroutines.EmptyCoroutineContext

/**
 * onEach()操作符
 * onEach()
 *
 * 1.onEach{} : 也是生成一个新的Flow，并不修改原Flow，只让你提供一个定制流程代码块，在每条数据到来时，执行一下这个代码块。
 *   然后这个数据原封不动的再往下发送。
 *   就是一个数据监听器。大括号里面又一个参数，就是上游发来的数据。这个数据也会原封不动的发到下游去，
 *   但是发下去之前，可以处理自己的逻辑。
 *
 *   可以进行多次调用，每次都是生成新的Flow。
 * 本例输出如下：
 * onEach 1: 1
 * onEach 2: 1
 * onEach 1: 2
 * onEach 2: 2
 * onEach 3: 2
 * collect: 2
 * onEach 1: 3
 * onEach 2: 3
 * onEach 1: 4
 * onEach 2: 4
 * onEach 3: 4
 * collect: 4
 * onEach 1: 5
 * onEach 2: 5
 */
fun main() = runBlocking<Unit> {
  val scope = CoroutineScope(EmptyCoroutineContext)
  val flow1 = flowOf(1, 2, 3, 4, 5)
  scope.launch {
    flow1.onEach {
      println("onEach 1: $it")
    }.onEach {
      println("onEach 2: $it")
    }.filter {
      it % 2 == 0
    }.onEach {
      println("onEach 3: $it")
    }.collect {
      println("collect: $it")
    }
  }
  delay(10000)
}